package com.kuang.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.kuang.mapper.UserMapper;
import com.kuang.pojo.User;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;


/**
 * (User)表控制层
 *
 * @author makejava
 * @since 2020-09-18 23:46:54
 */
@RestController
@RequestMapping("user")
public class UserController {
    /**
     * 服务对象
     */
    @Resource
    private UserMapper userMapper;

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("selectOne")
    public User selectOne(Long id) {
        return this.userMapper.selectById(id);
    }

    /**
     * 测试通过Id批量查询数据
     *
     * @param
     */
    @GetMapping("selectBatch")
    public void testSelectByBatchId() {
        List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
        users.forEach(System.out::println);
    }

    /**
     * 按条件查询之一：使用map
     */
    @GetMapping("selectByMap")
    public void testSelectByBatchIds(){
        HashMap<String, Object> map = new HashMap<>();
        // 自定义要查询
        map.put("name","销坷");
        List<User> users = userMapper.selectByMap(map);
        users.forEach(System.out::println);
    }

    /**
     * 查找整张表
     *
     */
    @GetMapping("selectAll")
    public List<User> selectAll() {
        List<User> users = userMapper.selectList(null);
        //users.forEach(System.out::println);
        return users;
    }

    /**
     * 插入数据
     *
     * @param user
     * @return 影响行数
     */
    @PostMapping("insertOne")
    public int insertOne(@RequestBody User user) {
        return this.userMapper.insert(user);
    }

    /**
     * 更新数据
     * @param
     */
    @PostMapping("updateOne")
    public void updateOne() {
        User user = new User();
        user.setId(6L);
        user.setName("销坷");
        user.setAge(2);

        int i = userMapper.updateById(user);
        System.out.println(i);
    }

    /**
     * 测试乐观锁
     */
    @PostMapping("optimistic")
    public void testOptimisticLocker(){
        // 1、查询用户信息
        User user = userMapper.selectById(1L);
        // 2、修改用户信息
        user.setName("kuangshen");
        user.setEmail("24736743@qq.com");
        // 3、执行更新操作
        userMapper.updateById(user);
    }


    /**
     * 多线程测试乐观锁
     */
    @PostMapping("mulOptimistic")
    public void testOptimisticLocker2(){
        // 线程 1
        User user = userMapper.selectById(1L);
        user.setName("kuangshen111");
        user.setEmail("24736743@qq.com");
        // 模拟另外一个线程执行了插队操作
        User user2 = userMapper.selectById(1L);
        user2.setName("kuangshen222");
        user2.setEmail("24736743@qq.com");
        userMapper.updateById(user2);
        // 自旋锁来多次尝试提交！
        // 如果没有乐观锁就会覆盖插队线程的值！
        userMapper.updateById(user);
    }

    /**
     * 测试分页插件
     *
     * current 当前页
     * size 页大小
     */
    @GetMapping("page")
    public void testPage(){
        //  参数一：当前页
        //  参数二：页面大小
        //  使用了分页插件之后，所有的分页操作也变得简单的！
        Page<User> page = new Page<>(2,5);
        userMapper.selectPage(page,null);

        page.getRecords().forEach(System.out::println);
        System.out.println(page.getTotal());
    }

    /**
     * 测试条件构造器 Wrapper
     */
    @GetMapping("testWrapper")
    public void contextLoads() {
        // 查询name不为空的用户，并且邮箱不为空的用户，年龄大于等于12
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.isNotNull("name").isNotNull("email").ge("age",12);
        userMapper.selectList(wrapper).forEach(System.out::println);
    }
}